package com.example.demo.order.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 购物车响应结果
 * 用于返回购物车项的详细信息，包括商品信息和数量等
 * 
 * @author MingChang.Wei
 * @since 2025/9/26
 */
@Data
@Schema(description = "购物车响应结果")
public class CartResponse {
    
    /**
     * 购物车项ID
     */
    @Schema(description = "购物车项ID，唯一标识购物车中的一个商品项", example = "1")
    private Long id;
    
    /**
     * 购物车所属用户
     */
    @Schema(description = "购物车所属用户名", example = "admin")
    private String createBy;
    
    /**
     * 商品ID
     */
    @Schema(description = "商品ID，关联商品表", example = "2001")
    private Long productId;
    
    /**
     * 商品名称
     */
    @Schema(description = "商品名称，冗余存储便于展示", example = "无线蓝牙耳机")
    private String productName;
    
    /**
     * 商品图片URL
     */
    @Schema(description = "商品主图URL，用于购物车列表展示", example = "https://example.com/product/123.jpg")
    private String imageUrl;
    
    /**
     * 商品SKU
     */
    @Schema(description = "商品SKU，规格型号信息", example = "黑色 标配")
    private String sku;
    
    /**
     * 商品单价（分）
     */
    @Schema(description = "商品单价，以分为单位存储", example = "19900")
    private BigDecimal price;
    
    /**
     * 商品数量
     */
    @Schema(description = "购物车中该商品的数量", example = "1")
    private Integer quantity;
    
    /**
     * 是否选中
     */
    @Schema(description = "是否选中，用于结算时选择商品", example = "false")
    private Boolean selected;
    
    /**
     * 小计金额（分）
     */
    @Schema(description = "小计金额，单价×数量，以分为单位", example = "19900")
    private BigDecimal subtotal;
    
    /**
     * 创建时间
     */
    @Schema(description = "购物车项创建时间")
    private LocalDateTime createTime;
    
    /**
     * 更新时间
     */
    @Schema(description = "购物车项最后更新时间")
    private LocalDateTime updateTime;
    
    /**
     * 计算小计金额
     * 小计 = 单价 × 数量
     * 
     * @return 小计金额，单位分
     */
    public BigDecimal getSubtotal() {
        if (price != null && quantity != null) {
            return price.multiply(new BigDecimal(quantity));
        }
        return BigDecimal.ZERO;
    }
    
    /**
     * 获取价格的元表示
     * 
     * @return 价格（元）
     */
    public BigDecimal getPriceInYuan() {
        if (price != null) {
            return price.divide(new BigDecimal("100"));
        }
        return BigDecimal.ZERO;
    }
    
    /**
     * 获取小计的元表示
     * 
     * @return 小计金额（元）
     */
    public BigDecimal getSubtotalInYuan() {
        return getSubtotal().divide(new BigDecimal("100"));
    }
    
    /**
     * 判断购物车项是否有效
     * 
     * @return 如果商品ID、价格、数量都不为空且数量大于0则返回true
     */
    public boolean isValid() {
        return productId != null && 
               price != null && 
               quantity != null && 
               quantity > 0 &&
               price.compareTo(BigDecimal.ZERO) >= 0;
    }
}
